package dao;

import entity.Order;
import util.DatabaseUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 订单数据操作实现类这个类专门负责处理和订单相关的数据库操作，
 */
public class OrderDAOImpl implements OrderDAO {

    /**
     * 创建一个新订单（当用户购买商品时调用）
     * @param order 包含订单信息的对象（如买家ID、商品ID、总金额）
     * @return true表示订单创建成功，false表示失败
     */
    @Override
    public boolean addOrder(Order order) {
        // 向orders表中插入一条新记录
        String sql = "INSERT INTO orders (buyer_id, item_id, total_amount) VALUES (?, ?, ?)";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            // 给SQL语句中的占位符 ? 赋值
            pstmt.setInt(1, order.getBuyerId());      // 第一个? 填买家ID
            pstmt.setInt(2, order.getItemId());       // 第二个? 填商品ID
            pstmt.setDouble(3, order.getTotalAmount()); // 第三个? 填订单总金额

            // 执行插入操作，并获取受影响的行数
            int affectedRows = pstmt.executeUpdate();
            // 如果受影响的行数大于0，说明插入成功
            return affectedRows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 更新订单的全部信息
     */
    @Override
    public boolean updateOrder(Order order) {
        // 根据订单ID更新订单的所有信息
        String sql = "UPDATE orders SET buyer_id = ?, item_id = ?, total_amount = ?, status = ? WHERE order_id = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            // 给SQL语句中的占位符 ? 赋值
            pstmt.setInt(1, order.getBuyerId());      // 买家ID
            pstmt.setInt(2, order.getItemId());       // 商品ID
            pstmt.setDouble(3, order.getTotalAmount()); // 总金额
            pstmt.setString(4, order.getStatus());    // 订单状态
            pstmt.setInt(5, order.getOrderId());      // 订单ID（这是WHERE条件，确定要更新哪条记录）

            int affectedRows = pstmt.executeUpdate();
            return affectedRows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据订单ID删除一个订单
     */
    @Override
    public boolean deleteOrder(int orderId) {
        // 根据订单ID删除一条记录
        String sql = "DELETE FROM orders WHERE order_id = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setInt(1, orderId); // 给? 赋值为要删除的订单ID

            int affectedRows = pstmt.executeUpdate();
            return affectedRows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据订单ID查询一个订单的详细信息
     */
    @Override
    public Order getOrderById(int orderId) {
        // 查询指定ID的订单信息
        String sql = "SELECT * FROM orders WHERE order_id = ?";
        Order order = null;

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setInt(1, orderId);

            // 执行查询，并获取结果集
            ResultSet rs = pstmt.executeQuery();

            // 如果结果集中有数据（说明找到了对应的订单）
            if (rs.next()) {
                // 结果集里的数据转换
                order = extractOrderFromResultSet(rs);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        // 返回查询到的订单对象，没找到就是null
        return order;
    }

    /**
     * 查询一个买家的所有订单
     */
    @Override
    public List<Order> getOrdersByBuyerId(int buyerId) {
        // 存放查询到的所有订单
        List<Order> orders = new ArrayList<>();
        // 查询指定买家ID的所有订单
        String sql = "SELECT * FROM orders WHERE buyer_id = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setInt(1, buyerId); // 给? 赋值为买家ID

            ResultSet rs = pstmt.executeQuery();

            // 循环遍历结果集中的每一行数据
            while (rs.next()) {
                // 把每一行数据转换成Order对象，然后添加到列表中
                orders.add(extractOrderFromResultSet(rs));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return orders;
    }

    /**
     * 查询数据库中的所有订单（通常用于管理员查看）
     */
    @Override
    public List<Order> getAllOrders() {
        List<Order> orders = new ArrayList<>();
        String sql = "SELECT * FROM orders"; // 查询所有订单的SQL

        try (Connection conn = DatabaseUtil.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {

            // 循环遍历所有查询结果
            while (rs.next()) {
                orders.add(extractOrderFromResultSet(rs));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return orders;
    }

    /**
     * 更新订单的状态
     */
    @Override
    public boolean updateOrderStatus(int orderId, String status) {
        // 根据订单ID更新订单状态
        String sql = "UPDATE orders SET status = ? WHERE order_id = ?";

        try (Connection conn = DatabaseUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, status);  // 第一个? 填新的状态
            pstmt.setInt(2, orderId);    // 第二个? 填订单ID

            int affectedRows = pstmt.executeUpdate();
            return affectedRows > 0;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 【私有工具方法】
     * 把从数据库查询到的结果集（ResultSet）转换成一个Order对象。
     * 这样就不用在每个查询方法里都写一遍赋值代码了，避免重复。
     */
    private Order extractOrderFromResultSet(ResultSet rs) throws SQLException {
        Order order = new Order();
        // 从结果集rs中获取数据，设置到Order对象的对应属性中
        order.setOrderId(rs.getInt("order_id"));
        order.setBuyerId(rs.getInt("buyer_id"));
        order.setItemId(rs.getInt("item_id"));
        order.setOrderDate(rs.getTimestamp("order_date")); // 获取订单创建时间
        order.setTotalAmount(rs.getDouble("total_amount"));
        order.setStatus(rs.getString("status"));
        return order;
    }
}